import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.ListIterator;
import java.util.Vector;

class Bank implements Serializable
{
	private String naamB;
	private Vector alleRekeningen;
	private Vector klanten;
	private Vector medewerkers;
	private Vector rekeningTypes;

	public Bank(String nmB)
	{
		this.naamB = nmB;
		alleRekeningen = new Vector();
		klanten = new Vector();
		medewerkers = new Vector();
		rekeningTypes = new Vector();
	}

	public boolean verwijder(Rekening r)
	{
		if (alleRekeningen.contains(r))
		{
			alleRekeningen.remove(r);
			return true;
		}
		else
			return false;
	}
	
	
	public boolean verwijderKlant(Klant k)
	{
		if (klanten.contains(k))
		{
			klanten.remove(k);
			return true;
		}
		else
			return false;
	}
	
	public boolean verwijderRekeningType(RekeningType rt){
		if (rekeningTypes.contains(rt)){
			rekeningTypes.remove(rt);
			return true;
		}
		else
			return false;
	}
	
	public boolean verwijderBankMedewerker(BankMedewerker bm)
	{
		if (medewerkers.contains(bm))
		{
			medewerkers.remove(bm);
			return true;
		}else{
			return false;
		}
	}

	public void voegToe(Rekening r)
	{
		if (!alleRekeningen.contains(r))
			alleRekeningen.add(r);	
	}
	
	public void voegKlantToe(Klant k)
	{
		if (!klanten.contains(k))
			klanten.add(k);	
	}
	
	public void voegMedewerkerToe(BankMedewerker bm)
	{
		if (!medewerkers.contains(bm))
			medewerkers.add(bm);
	}
	
	public void voegRekeningTypeToe(RekeningType rt){
		if(!rekeningTypes.contains(rt))
			rekeningTypes.add(rt);
	}

	public int aantal()
	{
		return alleRekeningen.size();
	}

	public Vector<Rekening> getRekeningenVoorKlant(Klant kl){
		Vector<Rekening> rek = new Vector<Rekening>(); 
		for(ListIterator i = alleRekeningen.listIterator() ; i.hasNext();){
			Rekening r = (Rekening) i.next();
			if(r.getRekeningHouder().equals(kl)){
				rek.add(r);
			}
		}
		return rek;
	}
	
	
	public int[] alleNummers()
	{
		int[] antw = new int[aantal()];
		int index = 0;
		for ( ListIterator i = alleRekeningen.listIterator() ; i.hasNext() ; )
		{
			Rekening r = (Rekening)i.next();
			int nummer = r.getRekNr();
			antw[index++] = nummer;
		}
		
		return antw;
	}
	/**
	 * Geeft alle klantnamen(String) terug in een Vector
	 * @return Vector<String> van klant namen (String)
	 */
	public Vector alleKlanten()
	{
		Vector antw = new Vector();
		for ( ListIterator i = klanten.listIterator() ; i.hasNext() ; )
		{
			Klant k = (Klant) i.next();
			String naam = k.getNaam();
			antw.add(naam);
		}
		return antw;
	}
	
	public Vector alleNummersVector()
	{
		Vector antw = new Vector();
		for ( ListIterator i = alleRekeningen.listIterator() ; i.hasNext() ; )
		{
			Rekening r = (Rekening)i.next();
			int nummer = r.getRekNr();
			antw.add(nummer);
		}
		return antw;
	}

	public Vector alleRekeningen()
	{
		Vector antw = new Vector();
		for ( ListIterator i = alleRekeningen.listIterator() ; i.hasNext() ; )
		{
			Rekening r = (Rekening)i.next();
			antw.add(r);
		}
		return antw;
	}
	
	public Vector alleRekeningTypes()
	{
		Vector<String> antw = new Vector<String>();
		for (ListIterator i = rekeningTypes.listIterator(); i.hasNext(); )
		{
			RekeningType r = (RekeningType)i.next();
			String naam = r.getNaam();
			antw.add(naam);
		}
		return antw;
	}
	public HashMap vanNaamKlantNaarRekening()
	{
		HashMap antw = new HashMap();

		for ( ListIterator i = alleRekeningen.listIterator() ; i.hasNext() ; )
		{
			Rekening rek = (Rekening)i.next();
			Klant kl = rek.getRekeningHouder();
			if ( kl != null )
			{
				Vector v = getRekeningenVoorKlant(kl);
				String s = kl.getNaam();
				antw.put(s , v);
			}
		}
		return antw;
	}
	public HashMap vanRekeningNrNaarRekening()
	{
		HashMap antw = new HashMap();

		for ( ListIterator i = alleRekeningen.listIterator() ; i.hasNext() ; )
		{
			Rekening rek = (Rekening)i.next();
			Klant kl = rek.getRekeningHouder();
			if ( kl != null )
			{
				//String s = kl.getNaam();
				antw.put(new Integer(rek.getRekNr()), rek);
			}
		}
		return antw;
	}
	
	public HashMap klanten()
	{
		HashMap antw = new HashMap();

		for ( ListIterator i = klanten.listIterator() ; i.hasNext() ; )
		{
			Klant klant = (Klant)i.next();
			if ( klant != null )
			{
				String s = klant.getNaam();
				antw.put(s , klant);
			}
		}
		return antw;
	}
	
	public HashMap medewerkers()
	{
		HashMap antw = new HashMap();

		for ( ListIterator i = medewerkers.listIterator() ; i.hasNext() ; )
		{
			BankMedewerker medewerker = (BankMedewerker)i.next();
			if ( medewerker != null )
			{
				String s = medewerker.getNaam();
				antw.put(s , medewerker);
			}
		}
		return antw;
	}
	
	public HashMap rekeningTypes()
	{
		HashMap<String,RekeningType> antw = new HashMap<String,RekeningType>();
		for ( ListIterator i = rekeningTypes.listIterator() ; i.hasNext() ; )
		{
			RekeningType rt = (RekeningType)i.next();
			if ( rt != null )
			{
				String s = rt.getNaam();
				antw.put(s , rt);
			}
		}
		return antw;
	}

	public void save() throws IOException{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Bank.obj"));
		oos.writeObject(this);
		oos.close();
	}
}